package com.omi.iberolactalpreventa;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.AlertDialog.Builder;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.database.Cursor;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

public class GestionDatos extends ListActivity{
	
	private ListView lstCargas;
	private ProgressDialog dlgprogress;
	private Builder dlgResult;
	private String result;
	private FTPClient client;
	private String ftpServer;
	private String ftpUser;
	private String ftpPassword;
	private int ftpPort;
	
	@SuppressLint({ "NewApi", "ShowToast" })
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_gestion_datos);
		
		DialogInterface.OnClickListener dialogResult = new OnClickListener() {
			
			@TargetApi(Build.VERSION_CODES.HONEYCOMB)
			@Override
			public void onClick(DialogInterface dialog, int which) {
				if(which==DialogInterface.BUTTON_POSITIVE)
				{
					Intent intAdmin = new Intent("com.omi.iberolactalpreventa.Administracion");
					startActivity(intAdmin);
				}
				
			}
		};
		
		getActionBar().setDisplayHomeAsUpEnabled(true);
		
		dlgResult = new Builder(this);
		dlgResult.setPositiveButton("Aceptar",dialogResult);
		
		lstCargas = (ListView)findViewById(android.R.id.list);
		dlgprogress = new ProgressDialog(this);
		dlgprogress.setMessage("Importando registros...");
		dlgprogress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		dlgprogress.setCancelable(false);
		
		//Cargamos la lista:
		String[] optCarga = new String[]{"Actualizar Datos","Enviar Datos"}; 
		
		ListAdapter adaptador = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,optCarga);
		
		lstCargas.setAdapter(adaptador);
		
		Modulebase.db.context = this;
	}
	
	@Override
	public void onBackPressed() {
		finish();
	}
	
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		switch(position)
		{
		case 0:
			//Carga de datos:
			dlgprogress.show();
		Thread t =new Thread(new Runnable() {
				  @Override
				  public void run()
				  {
					//Primero comprobamos si la carga va a realizarse por FTP o no.
						if(Modulebase.isFtp)
						{
							showDialogoProgess("Conectando al servidor");
							if(!configFtp())
							{
								dlgprogress.dismiss();
								return;
							}
							//Todo correcto, cogemos el fichero desde el FTP.
							try
							{
							showDialogoProgess("Descargando fichero datos.txt");
							//Eliminamos el archivo de carga si ya existe:
							File f = new File(Environment.getExternalStorageDirectory().getPath()+"/preventa/datos.txt");
							if(f.exists())
							{
								f.delete();
							}
							client.enterLocalPassiveMode();
							client.changeWorkingDirectory("/Salida");
							
							FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory().getPath()+"/preventa/datos.txt");
							
							showDialogoProgess("Descargando fichero datos.txt");
					//		dlgprogress.setMax((int)(getFileSize(client, "data.omi")/1000));
							client.retrieveFile("datos.txt", fos);
							
							client.logout();
							client.disconnect();
							}
							catch(Exception ex)
							{
								Log.d("Error"+ex.getMessage(),".");
							}
							}
						
						showDialogoProgess("Importando Datos.");
					  //Una vez tenemos el archivo en la carpeta, procedemos a importar.
					  result = Modulebase.db.importarDatos(dlgprogress);
					  
					  runOnUiThread(new Runnable() {
				      @Override
				      public void run()
				      {
				    	  //Modificamos los datos de la conexion para no perderlos:
				    	  Modulebase.db.ejecutarNonQuery("UPDATE CONFIGURACION SET FTP_SERVER='"+ftpServer+"',FTP_USER='"+ftpUser+"',FTP_PASIVE='0',PORT='"+ftpPort+"',FTP_PASSWORD='"+ftpPassword+"' WHERE USUARIO='ADMIN'");
				    	  dlgprogress.dismiss();
				    	  dlgprogress.setProgress(0);
				  		  dlgResult.setTitle("Importar Datos");
				  		  showDialogo(result);
				      }
				    });
				  }
				});
		t.start();
			break;
		case 1:
			//Descarga de datos:
			dlgprogress.show();
			
			new Thread(new Runnable() {
				  @Override
				  public void run()
				  {
					//Primero comprobamos si la descarga va a realizarse por FTP o no.
						if(Modulebase.isFtp)
						{
							if(!configFtp())
							{
								dlgprogress.dismiss();
								return;
							}
							
						}
						showDialogoProgess("Generando Fichero");
						//Si la conexion es correcta, enviamos los datos al ftp:
					  result = Modulebase.db.descargarDatos(dlgprogress);
					  runOnUiThread(new Runnable() {
				      @Override
				      public void run()
				      {
				    	  if(Modulebase.isFtp)
				    	  {
				    		  showDialogoProgess("Subiendo Archivo al FTP");
				    	  subirArchivo();
				    	  }
				    	  dlgprogress.dismiss();
				    	  showToast(result);
				    	 
				      }
				    });
					   
				  }
				}).start();
			
			break;
		}
	}
	
	private void subirArchivo()
	{
		new Thread(new Runnable() {
			  @Override
			  public void run()
			  {
		 
 	  //Enviamos el fichero al FTP.
 	  try
 	  {
 	  client.enterLocalPassiveMode();
 
       client.setFileType(FTP.ASCII_FILE_TYPE);

       FileInputStream in = new FileInputStream(new File(Environment.getExternalStorageDirectory().getPath()+"/preventa/"+Modulebase.ultimoArchivoSended));

       client.storeFile("Entrada/"+Modulebase.ultimoArchivoSended, in);
 	  in.close();
 	  client.logout();
 	  client.disconnect();
 	  }
 	  catch(Exception ex)
 	  {
 		  Log.d("Error: "+ex.getMessage(),".");
 	  }
			}
		}).start();
	}
	
	 @Override
     public boolean onOptionsItemSelected(MenuItem item) {
             switch (item.getItemId()) {
             case android.R.id.home:
              finish();
             default: 
              return super.onOptionsItemSelected(item);      
             }
     }
	 
	 private boolean configFtp()
	 {
 client = new FTPClient();
		 
		 Cursor c = Modulebase.db.ejecutarSelect(new String[]{"FTP_SERVER","FTP_USER","FTP_PASSWORD","FTP_PASIVE","PORT"}, "CONFIGURACION", null, null);
			
		 if(c!=null && c.moveToFirst() &&c.getString(0)!="" && c.getString(0)!=null)
		 {
			 try
			 {
			 client.connect(c.getString(0),c.getInt(4));

			 if(!client.login(c.getString(1),c.getString(2)))
			 {
				 showToast("Error, el usuario o la contraseña introducida no son correctos");
				 return false;
			 }
			//Guardamos los datos para completarles despues de la importacion y que asi no se pierdan:
			 ftpServer =c.getString(0);
			 ftpUser = c.getString(1);
			 ftpPassword = c.getString(2);
			 ftpPort = c.getInt(4);
			 return true;
			 }
			 catch(Exception ex)
			 {
				 showToast("Error al conectar con el servidor");
				 return false;
			 }
		 }
		 else
		 {
			 showToast("Error antes debe configurar los datos del FTP en opciones de red");
			 return false;
		 }
		
		 
	 }
	 
	 public void showToast(final String toast)
	 {
	     runOnUiThread(new Runnable() {
	         public void run()
	         {
	             Toast.makeText(GestionDatos.this, toast, Toast.LENGTH_SHORT).show();
	         }
	     });
	 }
	 
	 public void showDialogo(final String dialog)
	 {
	     runOnUiThread(new Runnable() {
	         public void run()
	         {
	        	 dlgResult.setMessage(dialog);
	        	 dlgResult.show();
	         }
	     });
	 }
	 
	 public void showDialogoProgess(final String dialog)
	 {
	     runOnUiThread(new Runnable() {
	         public void run()
	         {
	        	 dlgprogress.setMessage(dialog);
	        	 dlgprogress.show();
	         }
	     });
	 }
	 
	 
	/* private long getFileSize(FTPClient ftp, String filePath) throws Exception {
		    long fileSize = 0;
		    FTPFile[] files = ftp.listFiles(filePath);
		    if (files.length == 1 && files[0].isFile()) {
		        fileSize = files[0].getSize();
		    }
		    return fileSize;
		}
*/}
